home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / database / hl / hl-1.002 / hl-1 / Libr2Ascii / Libr2Ascii.cc next >
Encoding:
C/C++ Source or Header  |  1995-04-14  |  5.1 KB  |  219 lines

  1. /* -*- Mode: C -*- */
  2. /* Libr2Ascii.cc - Spit out a libr file as an ASCII text file.
  3.  * Created by Robert Heller on Sat Dec  7 23:09:11 1991
  4.  *
  5.  * ------------------------------------------------------------------
  6.  * Home Libarian by Deepwoods Software
  7.  * Library file to ASCII text file
  8.  * ------------------------------------------------------------------
  9.  * Modification History:
  10.  * ------------------------------------------------------------------
  11.  * Contents:
  12.  * ------------------------------------------------------------------
  13.  * 
  14.  * 
  15.  * Copyright (c) 1991,1992 by Robert heller (D/B/A Deepwoods Software)
  16.  *        All Rights Reserved
  17.  * 
  18.  */
  19.  
  20. #include <stream.h>
  21. #include <vBTree.h>
  22. #include <ctype.h>
  23. #ifdef MESSYDOS
  24. #include <CardRec.h>
  25. #include <ListRec.h>
  26. #else
  27. #include <CardRecord.h>
  28. #include <ListRecord.h>
  29. #endif
  30. #define VERSION "V1.0Beta"
  31. #ifdef MESSYDOS
  32. #include "Libr2Asc.h"
  33. #else
  34. #include "Libr2Ascii.h"
  35. #endif
  36. #ifdef unix
  37. #include <stdio.h>
  38. #endif
  39.  
  40. void QuoteStringBuffer(char* buffer,char* string)
  41. {
  42.     *buffer++ = '"';
  43.     while (*string != 0) {
  44.         if (*string == '"') *buffer++ = '\\';
  45.         *buffer++ = *string++;
  46.     }
  47.     *buffer++ = '"';
  48.     *buffer = 0;
  49. }
  50.  
  51. void QuoteStringStream(ostream& out,char* string)
  52. {
  53.     out << '"';
  54.     while (*string != 0) {
  55.         if (*string == '"') out << '\\';
  56.         out << *string++;
  57.     }
  58.     out << '"';
  59. }
  60.  
  61. static char buffer[2048];
  62.  
  63. void PrintCardRecord(CoreItem* item,int level)
  64. {
  65.     int indent = 0;
  66.     int column = 0;
  67.     QuoteStringBuffer(buffer,item->key);
  68.     cout << buffer << " ";
  69.     indent += strlen(buffer) + 1;
  70.     if (item->data.size <= 0) {
  71.         cout << "#C()\n";
  72.     } else {
  73.         cout << "#C("; indent += 3;
  74.         column = indent;
  75.         CardRecord rec(&item->data);
  76.         register Card *c = &rec;
  77.         char* tn = TypeName(c->type);
  78.         cout << form(":TYPE %s ",tn); column += 7 + strlen(tn);
  79.         QuoteStringBuffer(buffer,c->author);
  80.         if ((column + 9 + strlen(buffer))> 75) {
  81.             cout << "\n";
  82.             for (int cc = 0; cc < indent; cc++) cout << " ";
  83.             column = indent;
  84.         }
  85.         cout << form(":AUTHOR %s ", buffer);
  86.         column += 9 + strlen(buffer);
  87.         QuoteStringBuffer(buffer,c->title);
  88.         if ((column + 8 + strlen(buffer))> 75) {
  89.             cout << "\n";
  90.             for (int cc = 0; cc < indent; cc++) cout << " ";
  91.             column = indent;
  92.         }
  93.         cout << form(":TITLE %s ", buffer);
  94.         column += 8 + strlen(buffer);
  95.         QuoteStringBuffer(buffer,c->publisher);
  96.         if ((column + 12 + strlen(buffer))> 75) {
  97.             cout << "\n";
  98.             for (int cc = 0; cc < indent; cc++) cout << " ";
  99.             column = indent;
  100.         }
  101.         cout << form(":PUBLISHER %s ", buffer);
  102.         column += 12 + strlen(buffer);
  103.         QuoteStringBuffer(buffer,c->city);
  104.         if ((column + 7 + strlen(buffer))> 75) {
  105.             cout << "\n";
  106.             for (int cc = 0; cc < indent; cc++) cout << " ";
  107.             column = indent;
  108.         }
  109.         cout << form(":CITY %s ", buffer);
  110.         column += 7 + strlen(buffer);
  111.         sprintf(buffer,":VOLUME %d ",c->vol);
  112.         if ((column + strlen(buffer))> 75) {
  113.             cout << "\n";
  114.             for (int cc = 0; cc < indent; cc++) cout << " ";
  115.             column = indent;
  116.         }
  117.         cout << buffer; column += strlen(buffer);
  118.         sprintf(buffer,":YEAR %d ",c->year);
  119.         if ((column + strlen(buffer))> 75) {
  120.             cout << "\n";
  121.             for (int cc = 0; cc < indent; cc++) cout << " ";
  122.             column = indent;
  123.         }
  124.         cout << buffer; column += strlen(buffer);
  125.         if ((column + 12)> 75) {
  126.             cout << "\n";
  127.             for (int cc = 0; cc < indent; cc++) cout << " ";
  128.             column = indent;
  129.         }
  130.         cout << ":DESCRIPTION\n";
  131.         QuoteStringStream(cout,c->description);
  132.         cout << ")\n";
  133.     }
  134. }
  135.  
  136. void PrintListRecord(CoreItem* item,int level)
  137. {
  138.     int indent = 0;
  139.     int column = 0;
  140.     QuoteStringBuffer(buffer,item->key);
  141.     cout << buffer << " ";
  142.     indent += strlen(buffer) + 1;
  143.     if (item->data.size <= 0) {
  144.         cout << "#()\n";
  145.     } else {
  146.         cout << "#("; indent += 2;
  147.         column = indent;
  148.         ListRecord rec(&item->data);
  149.         int numitems = rec.ElementCount();
  150.         for (int i = 0;i < numitems; i++) {
  151.             QuoteStringBuffer(buffer,rec[i]);
  152.             if ((column + 2 + strlen(buffer))> 75) {
  153.                 cout << "\n";
  154.                 for (int c = 0; c < indent;c++)
  155.                     cout << " ";
  156.                 column = indent;
  157.             }
  158.             cout << buffer; column += strlen(buffer);
  159.             if ((i+1) < numitems) {
  160.                 cout << ", "; column += 2;
  161.             }
  162.         }
  163.         cout << ")\n";
  164.     }
  165. }
  166.  
  167. static void ErrorHandler(ErrKind err,char* msg)
  168. {
  169.     if (err == sysErr) {
  170.         int error = errno;
  171.         cerr << form("Error: System:%d %s %s\n",error,strerror(error),
  172.                 msg);
  173.     } else {
  174.         cerr << form("Error: %s %s\n",
  175.             (err == termErr ? "Terminal" : "Memory"),
  176.             msg);
  177.     }
  178. }
  179.     
  180. static int ikeys;
  181. void CountRecord(CoreItem* item,int level)
  182. {
  183.     ikeys++;
  184. }
  185.  
  186. int main(int argc,char **argv)
  187. {
  188.     Libr2Ascii args(argc,argv);
  189.     vBTree vtree(args.infile,(OpenMode)(ReadOnly));
  190.     if (vtree.OpenStat() == failure) {
  191.         int error = errno;
  192.         cerr << "Could not open " << args.infile
  193.              << ": " << strerror(error) << "\n";
  194.         exit(error);
  195.     }
  196.     vtree.ErrorFun() = ErrorHandler;
  197.     
  198.     cout << vtree.CountPages() << "\n";
  199.     ikeys = 0;
  200.     vtree.TraverseId(CountRecord);
  201.     cout << ikeys << "\n";
  202.     vtree.TraverseId(PrintCardRecord);
  203.     ikeys = 0;
  204.     vtree.TraverseTitle(CountRecord);
  205.     cout << ikeys << "\n";
  206.     vtree.TraverseTitle(PrintListRecord);
  207.     ikeys = 0;
  208.     vtree.TraverseAuthor(CountRecord);
  209.     cout << ikeys << "\n";
  210.     vtree.TraverseAuthor(PrintListRecord);
  211.     ikeys = 0;
  212.     vtree.TraverseSubj(CountRecord);
  213.     cout << ikeys << "\n";
  214.     vtree.TraverseSubj(PrintListRecord);
  215. }
  216.  
  217.     
  218.  
  219.